<!DOCTYPE html>
<html lang=en>
<head>
    <!-- so meta -->
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="HandheldFriendly" content="True">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
    <meta name="description" content="一篇不一样的docker原理解析 uncle creepy 擅长分析分布式一致性系统，数据处理，系统负载均衡等问题 0 引言在学习docker的过程中，我发现目前docker学习最大的障碍，不是网上的资源太少，而是网上的资源太多，资源太多带来的噪声让学习效率降低不少。而在讲解docker原理上，所有的讲解都是关于cgroups，namespace，aufs以及deviceMapper，这对于一个初">
<meta property="og:type" content="article">
<meta property="og:title" content="一篇不一样的docker原理解析">
<meta property="og:url" content="http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/index.html">
<meta property="og:site_name" content="TmoonSite">
<meta property="og:description" content="一篇不一样的docker原理解析 uncle creepy 擅长分析分布式一致性系统，数据处理，系统负载均衡等问题 0 引言在学习docker的过程中，我发现目前docker学习最大的障碍，不是网上的资源太少，而是网上的资源太多，资源太多带来的噪声让学习效率降低不少。而在讲解docker原理上，所有的讲解都是关于cgroups，namespace，aufs以及deviceMapper，这对于一个初">
<meta property="og:locale" content="en_US">
<meta property="og:image" content="https://pic4.zhimg.com/da8e974dc_xs.jpg">
<meta property="og:image" content="https://pic3.zhimg.com/80/307fc27ab1dbab631edd25496423f0fe_hd.jpg">
<meta property="article:published_time" content="2018-12-17T06:13:24.000Z">
<meta property="article:modified_time" content="2020-01-07T10:48:14.751Z">
<meta property="article:author" content="Tmoonlight">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://pic4.zhimg.com/da8e974dc_xs.jpg">
    
    
        
          
              <link rel="shortcut icon" href="/images/favicon.ico">
          
        
        
          
            <link rel="icon" type="image/png" href="/images/logo2.gif" sizes="192x192">
          
        
        
          
            <link rel="apple-touch-icon" sizes="180x180" href="/images/logo2.gif">
          
        
    
    <!-- title -->
    <title>一篇不一样的docker原理解析</title>
    <!-- styles -->
    
<link rel="stylesheet" href="/css/style.css">

    <!-- persian styles -->
    
      
<link rel="stylesheet" href="/css/rtl.css">

    
    <!-- rss -->
    
    
<meta name="generator" content="Hexo 4.2.0"></head>

<body class="max-width mx-auto px3 ltr">
    
      <div id="header-post">
  <a id="menu-icon" href="#"><i class="fas fa-bars fa-lg"></i></a>
  <a id="menu-icon-tablet" href="#"><i class="fas fa-bars fa-lg"></i></a>
  <a id="top-icon-tablet" href="#" onclick="$('html, body').animate({ scrollTop: 0 }, 'fast');" style="display:none;"><i class="fas fa-chevron-up fa-lg"></i></a>
  <span id="menu">
    <span id="nav">
      <ul>
         
          <li><a href="/">Home</a></li>
         
          <li><a href="/about/">About</a></li>
         
          <li><a href="/archives/">Writing</a></li>
         
          <li><a href="/projects_url">Projects</a></li>
        
      </ul>
    </span>
    <br/>
    <span id="actions">
      <ul>
        
        <li><a class="icon" href="/2018/12/21/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90%E6%8F%90%E9%AB%98%E7%AF%87/"><i class="fas fa-chevron-left" aria-hidden="true" onmouseover="$('#i-prev').toggle();" onmouseout="$('#i-prev').toggle();"></i></a></li>
        
        
        <li><a class="icon" href="/2018/12/11/Docker%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E4%B8%8E%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/"><i class="fas fa-chevron-right" aria-hidden="true" onmouseover="$('#i-next').toggle();" onmouseout="$('#i-next').toggle();"></i></a></li>
        
        <li><a class="icon" href="#" onclick="$('html, body').animate({ scrollTop: 0 }, 'fast');"><i class="fas fa-chevron-up" aria-hidden="true" onmouseover="$('#i-top').toggle();" onmouseout="$('#i-top').toggle();"></i></a></li>
        <li><a class="icon" href="#"><i class="fas fa-share-alt" aria-hidden="true" onmouseover="$('#i-share').toggle();" onmouseout="$('#i-share').toggle();" onclick="$('#share').toggle();return false;"></i></a></li>
      </ul>
      <span id="i-prev" class="info" style="display:none;">Previous post</span>
      <span id="i-next" class="info" style="display:none;">Next post</span>
      <span id="i-top" class="info" style="display:none;">Back to top</span>
      <span id="i-share" class="info" style="display:none;">Share post</span>
    </span>
    <br/>
    <div id="share" style="display: none">
      <ul>
  <li><a class="icon" href="http://www.facebook.com/sharer.php?u=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/" target="_blank" rel="noopener"><i class="fab fa-facebook " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://twitter.com/share?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&text=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-twitter " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://www.linkedin.com/shareArticle?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&title=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-linkedin " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://pinterest.com/pin/create/bookmarklet/?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&is_video=false&description=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-pinterest " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="mailto:?subject=一篇不一样的docker原理解析&body=Check out this article: http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/"><i class="fas fa-envelope " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://getpocket.com/save?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&title=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-get-pocket " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://reddit.com/submit?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&title=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-reddit " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://www.stumbleupon.com/submit?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&title=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-stumbleupon " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://digg.com/submit?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&title=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-digg " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://www.tumblr.com/share/link?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&name=一篇不一样的docker原理解析&description=" target="_blank" rel="noopener"><i class="fab fa-tumblr " aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://news.ycombinator.com/submitlink?u=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&t=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-hacker-news " aria-hidden="true"></i></a></li>
</ul>

    </div>
    <div id="toc">
      <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#一篇不一样的docker原理解析"><span class="toc-number">1.</span> <span class="toc-text">一篇不一样的docker原理解析</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#0-引言"><span class="toc-number">1.1.</span> <span class="toc-text">0 引言</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#1-虚拟机"><span class="toc-number">1.2.</span> <span class="toc-text">1 虚拟机</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2-容器的概念"><span class="toc-number">1.3.</span> <span class="toc-text">2 容器的概念</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#3-how-to-learn-more"><span class="toc-number">1.4.</span> <span class="toc-text">3 how to learn more</span></a></li></ol></li></ol>
    </div>
  </span>
</div>

    
    <div class="content index py4">
        
        <article class="post" itemscope itemtype="http://schema.org/BlogPosting">
  <header>
    
    <h1 class="posttitle" itemprop="name headline">
        一篇不一样的docker原理解析
    </h1>



    <div class="meta">
      <span class="author" itemprop="author" itemscope itemtype="http://schema.org/Person">
        <span itemprop="name">TmoonSite</span>
      </span>
      
    <div class="postdate">
      
        <time datetime="2018-12-17T06:13:24.000Z" itemprop="datePublished">2018-12-17</time>
        
      
    </div>


      

      

    </div>
  </header>
  

  <div class="content" itemprop="articleBody">
    <h1 id="一篇不一样的docker原理解析"><a href="#一篇不一样的docker原理解析" class="headerlink" title="一篇不一样的docker原理解析"></a>一篇不一样的docker原理解析</h1><p><a href="https://www.zhihu.com/people/creepyuncle" target="_blank" rel="noopener"><img src="https://pic4.zhimg.com/da8e974dc_xs.jpg" alt=""></a></p>
<p><a href="https://www.zhihu.com/people/creepyuncle" target="_blank" rel="noopener">uncle creepy</a></p>
<p>擅长分析分布式一致性系统，数据处理，系统负载均衡等问题</p>
<h2 id="0-引言"><a href="#0-引言" class="headerlink" title="0 引言"></a>0 引言</h2><p>在学习docker的过程中，我发现目前docker学习最大的障碍，不是网上的资源太少，而是网上的资源太多，资源太多带来的噪声让学习效率降低不少。而在讲解docker原理上，所有的讲解都是关于cgroups，namespace，aufs以及deviceMapper，这对于一个初学者来说，就是用一堆名词替换另一堆名词，所以我打算写一篇不涉及太多api的原理解析，在这篇解析中，将不会讨论：</p>
<ul>
<li><p>一堆堆砌在一起的专有名词，让阅读者云里雾里</p>
</li>
<li><p>一大堆写满了专有名词的图，但是不给太多解释</p>
</li>
</ul>
<p>这篇解析将会涉及：</p>
<ul>
<li><p>虚拟机的实现原理</p>
</li>
<li><p>虚拟机和容器的区别</p>
</li>
</ul>
<p>在开始讨论前，先抛出一些问题，可先别急着查看答案，讨论的过程可以让答案更有趣，问题如下：</p>
<ul>
<li><p><a href="https://link.zhihu.com/?target=http%3A//superuser.com/questions/889472/docker-containers-have-their-own-kernel-or-not">Docker 容器有自己的kernel吗</a></p>
</li>
<li><p><a href="https://link.zhihu.com/?target=https%3A//groups.google.com/forum/%23%21topic/docker-user/IDz4iQ15t0A">docker的kernel version由镜像确定还是由宿主机确定</a></p>
</li>
</ul>
<h2 id="1-虚拟机"><a href="#1-虚拟机" class="headerlink" title="1 虚拟机"></a>1 虚拟机</h2><p>先来理解一下虚拟机概念，广义来说，虚拟机是一种模拟系统，即在软件层面上通过模拟硬件的输入和输出，让虚拟机的操作系统得以运行在没有物理硬件的环境中（也就是宿主机的操作系统上），其中能够模拟出硬件输入输出，让虚拟机的操作系统可以启动起来的程序，被叫做hypervisor。用一张图来说明这个关系就是：</p>
<p><img src="https://pic3.zhimg.com/80/307fc27ab1dbab631edd25496423f0fe_hd.jpg" alt=""></p>
<p>在这张图中：</p>
<ul>
<li><p>物理机被称为宿主机</p>
</li>
<li><p>虚拟机也被称为guest OS</p>
</li>
<li><p>而被hypervisor虚拟出来的硬件被称为虚拟硬件</p>
</li>
</ul>
<p>比如，举一个大家都很熟悉的例子，在编写android程序时，调试和测试运行都可以在X86架构的台式机或笔记本进行，这就是一个典型的虚拟机例子，在这之中：</p>
<ul>
<li><p>宿主机就是台式机或笔记本</p>
</li>
<li><p>虚拟机就是虚拟出来的android</p>
</li>
<li><p>而模拟android的软件就是android box</p>
</li>
</ul>
<p>当然android模拟机一个大问题就是：启动速度非常慢，最长可达10分钟或以上，这是因为单纯模拟硬件的输入输出，效率是很差的，所以这样的虚拟机如果真部署在服务器上，速度是感人的。</p>
<p>这个时候，就有计算机科学家提出了非常偷懒的想法：假如我们不模拟硬件输入输出，只是做下真实硬件输入输出的搬运工，那么虚拟机的指令执行速度，就可以和宿主机一致了。当然这前提是宿主机的硬件架构必须和虚拟硬件架构一致。比如，</p>
<ul>
<li><p>我们可以在linux的台式机上轻松模拟windows，而且这个windows的运行速度基本上和原生装一个windows速度差不多，因为windows也能被直接安装在这台台式机上。</p>
</li>
<li><p>这个思路对于在windows系统中运行android系统不管用，因为android系统的运行硬件一般是手机（arm系统，可以理解为不同的硬件架构体系和cpu指令集），所以android模拟机还是一样的慢。</p>
</li>
</ul>
<p>由于本篇并不是主要关于虚拟机的内容，所以这些点就点到而止，更多详细内容可以参阅：<a href="https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Hypervisor">Hypervisor</a></p>
<h2 id="2-容器的概念"><a href="#2-容器的概念" class="headerlink" title="2 容器的概念"></a>2 容器的概念</h2><p>一般来说，虚拟机都会有自己的kernel，自己的硬件，这样虚拟机启动的时候需要先做开机自检，启动kernel，启动用户进程等一系列行为，虽然现在电脑运行速度挺快，但是这一系列检查做下来，也要几十秒，也就是虚拟机需要几十秒来启动。</p>
<ul>
<li><p>重新来理解虚拟机的概念，计算机科学家发现其实我们创建虚拟机也不一定需要模拟硬件的输入和输出，假如宿主机和虚拟机他们的kernel是一致的，就不用做硬件输入输出的搬运工了，只需要做kernel输入输出的搬运工即可，为了有别于硬件层面的虚拟机，这种虚拟机被命名为 操作系统层虚拟化：<a href="https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Operating-system-level_virtualization">Operating-system-level virtualization</a> 也被叫做容器</p>
</li>
<li><p>让我们来回顾虚拟机的概念，在虚拟机的系统中，虚拟机认为自己有独立的文件系统，进程系统，内存系统，等等一系列，所以为了让容器接近虚拟机，也需要有独立的文件系统，进程系统，内存系统，等等一系列，为了达成这一目的，主机系统采用的办法是：只要隔离容器不让它看到主机的文件系统，进程系统，内存系统，等等一系列，那么容器系统就是一个接近虚拟机的玩意了</p>
</li>
</ul>
<p>更多关于容器的内容可以看这份课件：<a href="https://link.zhihu.com/?target=https%3A//courses.engr.illinois.edu/cs423/lectures/VirtOS.pdf">https://</a><a href="https://link.zhihu.com/?target=https%3A//courses.engr.illinois.edu/cs423/lectures/VirtOS.pdf">courses.engr.illinois.edu</a><a href="https://link.zhihu.com/?target=https%3A//courses.engr.illinois.edu/cs423/lectures/VirtOS.pdf">/cs423/lectures/VirtOS.pdf</a></p>
<p>至此就可以回答引言提到的两个问题：</p>
<ul>
<li><p><a href="https://link.zhihu.com/?target=http%3A//superuser.com/questions/889472/docker-containers-have-their-own-kernel-or-not">Docker 容器有自己的kernel吗</a></p>
</li>
<li><p>没有，docker和宿主机共享kernel</p>
</li>
<li><p><a href="https://link.zhihu.com/?target=https%3A//groups.google.com/forum/%23%21topic/docker-user/IDz4iQ15t0A">docker的kernel version由镜像确定还是由宿主机确定</a></p>
</li>
<li><p>由宿主机决定</p>
</li>
</ul>
<h2 id="3-how-to-learn-more"><a href="#3-how-to-learn-more" class="headerlink" title="3 how to learn more"></a>3 how to learn more</h2><pre><code>* 关于操作系统层的虚拟化的概念：[Operating-system-level virtualization](https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Operating-system-level_virtualization) 以及包括freebsd jail有关的一系列其他的操作系统上相似的实现

* 想要了解更多，docker具体做了什么，可以参考：[一篇不一样的docker原理解析 提高篇 - uncle creepy的文章 - 知乎专栏](https://zhuanlan.zhihu.com/p/22403015)

* 关于namespace，cgroups，aufs，deviceMapper 可以了解官方文档

* 在mac os和windows上运行docker的秘密：[Boot2docker by boot2docker](https://link.zhihu.com/?target=http%3A//boot2docker.io/) 就是通过这个叫做boot2docker的玩意启动了一个虚拟linux kernel，所有的docker容器都跑在这个kernel上</code></pre>
  </div>
</article>



        
          <div id="footer-post-container">
  <div id="footer-post">

    <div id="nav-footer" style="display: none">
      <ul>
         
          <li><a href="/">Home</a></li>
         
          <li><a href="/about/">About</a></li>
         
          <li><a href="/archives/">Writing</a></li>
         
          <li><a href="/projects_url">Projects</a></li>
        
      </ul>
    </div>

    <div id="toc-footer" style="display: none">
      <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#一篇不一样的docker原理解析"><span class="toc-number">1.</span> <span class="toc-text">一篇不一样的docker原理解析</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#0-引言"><span class="toc-number">1.1.</span> <span class="toc-text">0 引言</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#1-虚拟机"><span class="toc-number">1.2.</span> <span class="toc-text">1 虚拟机</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#2-容器的概念"><span class="toc-number">1.3.</span> <span class="toc-text">2 容器的概念</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#3-how-to-learn-more"><span class="toc-number">1.4.</span> <span class="toc-text">3 how to learn more</span></a></li></ol></li></ol>
    </div>

    <div id="share-footer" style="display: none">
      <ul>
  <li><a class="icon" href="http://www.facebook.com/sharer.php?u=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/" target="_blank" rel="noopener"><i class="fab fa-facebook fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://twitter.com/share?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&text=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-twitter fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://www.linkedin.com/shareArticle?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&title=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-linkedin fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://pinterest.com/pin/create/bookmarklet/?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&is_video=false&description=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-pinterest fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="mailto:?subject=一篇不一样的docker原理解析&body=Check out this article: http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/"><i class="fas fa-envelope fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://getpocket.com/save?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&title=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-get-pocket fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://reddit.com/submit?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&title=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-reddit fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://www.stumbleupon.com/submit?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&title=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-stumbleupon fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://digg.com/submit?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&title=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-digg fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="http://www.tumblr.com/share/link?url=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&name=一篇不一样的docker原理解析&description=" target="_blank" rel="noopener"><i class="fab fa-tumblr fa-lg" aria-hidden="true"></i></a></li>
  <li><a class="icon" href="https://news.ycombinator.com/submitlink?u=http://yoursite.com/2018/12/17/%E4%B8%80%E7%AF%87%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84docker%E5%8E%9F%E7%90%86%E8%A7%A3%E6%9E%90/&t=一篇不一样的docker原理解析" target="_blank" rel="noopener"><i class="fab fa-hacker-news fa-lg" aria-hidden="true"></i></a></li>
</ul>

    </div>

    <div id="actions-footer">
        <a id="menu" class="icon" href="#" onclick="$('#nav-footer').toggle();return false;"><i class="fas fa-bars fa-lg" aria-hidden="true"></i> Menu</a>
        <a id="toc" class="icon" href="#" onclick="$('#toc-footer').toggle();return false;"><i class="fas fa-list fa-lg" aria-hidden="true"></i> TOC</a>
        <a id="share" class="icon" href="#" onclick="$('#share-footer').toggle();return false;"><i class="fas fa-share-alt fa-lg" aria-hidden="true"></i> Share</a>
        <a id="top" style="display:none" class="icon" href="#" onclick="$('html, body').animate({ scrollTop: 0 }, 'fast');"><i class="fas fa-chevron-up fa-lg" aria-hidden="true"></i> Top</a>
    </div>

  </div>
</div>

        
        <footer id="footer">
  <div class="footer-left">
    Copyright &copy; 2020 Tmoonlight
  </div>
  <div class="footer-right">
    <nav>
      <ul>
         
          <li><a href="/">Home</a></li>
         
          <li><a href="/about/">About</a></li>
         
          <li><a href="/archives/">Writing</a></li>
         
          <li><a href="/projects_url">Projects</a></li>
        
      </ul>
    </nav>
  </div>
</footer>

    </div>
    <!-- styles -->

<link rel="stylesheet" href="/lib/font-awesome/css/all.min.css">


<link rel="stylesheet" href="/lib/justified-gallery/css/justifiedGallery.min.css">


    <!-- jquery -->

<script src="/lib/jquery/jquery.min.js"></script>


<script src="/lib/justified-gallery/js/jquery.justifiedGallery.min.js"></script>

<!-- clipboard -->

  
<script src="/lib/clipboard/clipboard.min.js"></script>

  <script type="text/javascript">
  $(function() {
    // copy-btn HTML
    var btn = "<span class=\"btn-copy tooltipped tooltipped-sw\" aria-label=\"Copy to clipboard!\">";
    btn += '<i class="far fa-clone"></i>';
    btn += '</span>'; 
    // mount it!
    $(".highlight table").before(btn);
    var clip = new ClipboardJS('.btn-copy', {
      text: function(trigger) {
        return Array.from(trigger.nextElementSibling.querySelectorAll('.code')).reduce((str,it)=>str+it.innerText+'\n','')
      }
    });
    clip.on('success', function(e) {
      e.trigger.setAttribute('aria-label', "Copied!");
      e.clearSelection();
    })
  })
  </script>


<script src="/js/main.js"></script>

<!-- search -->

<!-- Google Analytics -->

<!-- Baidu Analytics -->

<!-- Disqus Comments -->


</body>
</html>
